﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Web.CrmContacto.Code;
using CrmContacto.Contracts.Contracts;
using Web.Framework.Translate;
using CrmContacto.Contracts.Enums;
using Web.Framework;
using CrmContacto.Contracts.Contracts.Search;
using CrmContacto.WebApp.Code.InnerClasses;
using CrmContacto.Contracts;
using CrmContacto.WebApp.Code.InnerClasses.FrontEnd;
using Web.Framework.Misc;
using Web.CrmContacto.Code.Security;
using Web.Framework.Helpers;

namespace CrmContacto.WebApp.App
{
    public partial class ListaDistribucionEdit : BasePage
    {
        public ListaDeDistribucion listaDistribucionCurrent
        {
            get
            {
                return (ListaDeDistribucion)ViewState["listaDistribucionCurrent"];
            }
            set
            {
                ViewState["listaDistribucionCurrent"] = value;
            }
        }

        private CustomerSearchParam CustomerSearchParamSession
        {
            get
            {
                return (CustomerSearchParam)StoreHelper.GetObject(MiscClass.CustomerSearchParamCacheKey);
            }
            set
            {
                StoreHelper.StoreObject(MiscClass.CustomerSearchParamCacheKey, value);
            }
        }

        private List<LinkButton> actionButtons = new List<LinkButton>();
        LinkButton eliminarButton = new LinkButton();
        LinkButton guardarButton = new LinkButton();
        LinkButton agregarContactosButton = new LinkButton();
        LinkButton activarInactivarButton = new LinkButton();
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
          
            guardarButton.ID = "BoCommandGuardar";
            guardarButton.Text = LocalizationProvider.Instance["Bo.Command.Guardar"];
            guardarButton.OnClientClick = "return window.ListaDistribucionEditObj.ValidateGuardar();";
            guardarButton.Click += new EventHandler(lnkSave_Click);
            actionButtons.Add(guardarButton);           

            LinkButton volverButton = new LinkButton();
            volverButton.ID = "BoCommandVolver";
            volverButton.CausesValidation = false;
            SetJavascriptForClientClickDirtyChech(volverButton);
            volverButton.Text = LocalizationProvider.Instance["Bo.Command.Volver"];
            volverButton.Click += new EventHandler(lnkCancelar_Click);
            actionButtons.Add(volverButton);
            
            SetJavascriptForClientClickDirtyChech(agregarContactosButton);
            agregarContactosButton.CausesValidation = false;
            agregarContactosButton.ID = "BoListaDistribucionActionMenuAgregarContactos";
            agregarContactosButton.Text = LocalizationProvider.Instance["Bo.ListaDistribucion.ActionMenu.AgregarContactos"];
            agregarContactosButton.Click += new EventHandler(agregarContactosButton_Click);
            actionButtons.Add(agregarContactosButton);
            
            activarInactivarButton.CausesValidation = false;
            activarInactivarButton.ID = "BoCommandActivar";
            SetJavascriptForClientClickDirtyChech(activarInactivarButton);
            activarInactivarButton.Click += new EventHandler(ActivarInactivarButton_Click);
            actionButtons.Add(activarInactivarButton);

            eliminarButton.ID = "BoCommandEliminar";
            eliminarButton.CausesValidation = false;
            eliminarButton.Text = LocalizationProvider.Instance["Bo.Command.Eliminar"];
            eliminarButton.Click += new EventHandler(eliminarButton_Click);
            actionButtons.Add(eliminarButton);

            base.LoadContextActions(actionButtons);

            this.lnkGuardar.Click += new EventHandler(lnkSave_Click);
        }

        private void eliminarButton_Click(object sender, EventArgs e)
        {
            try
            {
                WebServiceHelper.EliminarListaDeDistribucion(listaDistribucionCurrent.Id);
                Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlListaDeDistribucionList + string.Format("?{0}=1", MiscClass.QueryShowDeleted), true);                
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void ActivarInactivarButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (listaDistribucionCurrent.Id != 0 && listaDistribucionCurrent.Estado.HasValue)
                {
                    EstadoListaDeDistribucion estado = (EstadoListaDeDistribucion)listaDistribucionCurrent.Estado;
                    listaDistribucionCurrent.Estado = (int)(estado == EstadoListaDeDistribucion.Activa ? EstadoListaDeDistribucion.Inactiva : EstadoListaDeDistribucion.Activa);
                    WebServiceHelper.ActivarEntidad(listaDistribucionCurrent.GetType().Name, listaDistribucionCurrent.Estado, listaDistribucionCurrent.Id);
                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {            
            try
            {
                if (!this.IsPostBack)
                {
                    if (this.Request.QueryString["Id"] == null)
                    {
                        HasPermissionToSeeMe(CrmSecurity.DISTRIBUTIONLIST_MANAGE);
                        NuevaListaDeDistribucion();
                    }
                    else
                    {
                        HasPermissionToSeeMe(CrmSecurity.DISTRIBUTIONLIST_SEARCH, CrmSecurity.DISTRIBUTIONLIST_MANAGE, CrmSecurity.CUSTOMER_ADDTO_DISTRIBUTIONLIST);
                        listaDistribucionCurrent = WebServiceHelper.GetListaDeDistribucion(new ListaDistribucionSearch() { Id = Convert.ToInt32(this.Request.QueryString["Id"]), LoadContactos = true }).First();
                    }

                    LoadCbos();

                    if (this.Request.QueryString["loadingContacts"] != null)
                    {
                        LoadContextCustomers();
                    }

                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void NuevaListaDeDistribucion()
        {
            listaDistribucionCurrent = new ListaDeDistribucion();
            listaDistribucionCurrent.EmpresaId = BasePage.CompanyId;
            listaDistribucionCurrent.Estado = (int)EstadoListaDeDistribucion.Activa;
        }

        private void LoadContextCustomers()
        {
            base.NavigationContext.AgregandoContactosAListaDistribucion = false;
            base.NavigationContext.ListaDistribucionId = null;

            int pageSize = CustomerSearchParamSession.PageSize;
            int pageSkip = CustomerSearchParamSession.PageSkip;

            CustomerSearchParamSession.PageSize = 0;
            CustomerSearchParamSession.PageSkip = 0;

            var result = WebServiceHelper.GetCustomers(CustomerSearchParamSession);
            CustomerSearchParamSession.Ids.Clear(); // Limpio la seleccion

            CustomerSearchParamSession.PageSize = pageSize;
            CustomerSearchParamSession.PageSkip = pageSkip;

            // Agrego a los clientes que no esta agregados
            List<Cliente> contactosAAgregar = new List<Cliente>();
            foreach (var contacto in result.Resultados)
            {
                if (listaDistribucionCurrent.ContactoList.Where(c => c.Id == contacto.Id).Count() == 0)
                {
                    contactosAAgregar.Add(contacto);
                }
            }

            if (contactosAAgregar.Count > 0)
            {
                listaDistribucionCurrent.UpdateContactoList = true;
            }

            foreach (var contactoAAgregar in contactosAAgregar)
            {
                listaDistribucionCurrent.ContactoList.Add(contactoAAgregar);
            }
        }

        private void LoadCbos()
        {
            UIHelper.LoadEstados<EstadoListaDeDistribucion>(this.cboEstadoListaDistribucion, LocalizationProvider.Instance["DropDown.SinEspecificar"]);
        }

        protected override void ApplySecurity()
        {
            base.ApplySecurity();

            HasPermissionToSeeMe(CrmSecurity.DISTRIBUTIONLIST_SEARCH, CrmSecurity.DISTRIBUTIONLIST_MANAGE, CrmSecurity.CUSTOMER_ADDTO_DISTRIBUTIONLIST);

            if (listaDistribucionCurrent.Id != 0)
            {
                eliminarButton.Visible = 
                guardarButton.Visible =               
                activarInactivarButton.Visible = HasPermissionFor(CrmSecurity.DISTRIBUTIONLIST_MANAGE);
                agregarContactosButton.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_ADDTO_DISTRIBUTIONLIST);
            }
            else
            {                
                guardarButton.Visible = HasPermissionFor(CrmSecurity.DISTRIBUTIONLIST_MANAGE);
                eliminarButton.Visible =
                activarInactivarButton.Visible =
                agregarContactosButton.Visible = false;
            }

            if (this.GridContactos.DataSource != null)
            {
                this.GridContactos.Columns[0].Visible = HasPermissionFor(CrmSecurity.CUSTOMERSEARCH_VIEW);
                this.GridContactos.Columns[1].Visible = HasPermissionFor(CrmSecurity.CUSTOMER_ADDTO_DISTRIBUTIONLIST);
            }

            if (listaDistribucionCurrent.Id != 0)
            {
                SetJavascriptForDeleteRecord(eliminarButton, listaDistribucionCurrent.Nombre);
            }            
        }

        private void Bind()
        {

            if (listaDistribucionCurrent.Estado.HasValue)
            {
                this.cboEstadoListaDistribucion.SelectedValue = listaDistribucionCurrent.Estado.Value.ToString();
            }

            if (listaDistribucionCurrent.Id != 0)
            {
                this.txtNombre.Text = listaDistribucionCurrent.Nombre;
                this.txtDescripcion.Text = listaDistribucionCurrent.Descripcion;
                
                if (listaDistribucionCurrent.Estado.HasValue)
                {
                    EstadoCliente estadoCliente = (EstadoCliente)listaDistribucionCurrent.Estado.Value;
                    LinkButton activarInactivarButton = actionButtons.Where(b => b.ID == "BoCommandActivar").Single();
                    switch (estadoCliente)
                    {
                        case EstadoCliente.Activo:
                            activarInactivarButton.Text = LocalizationProvider.Instance["Bo.Command.Inactivar"];
                            break;
                        case EstadoCliente.Inactivo:
                            activarInactivarButton.Text = LocalizationProvider.Instance["Bo.Command.Activar"];
                            break;
                        default:
                            activarInactivarButton.Visible = false;
                            break;
                    }
                }
            }

            BindToGrid();
        }

        private void BindToGrid()
        {
            this.GridContactos.DataSource = this.listaDistribucionCurrent.ContactoList;
            this.GridContactos.DataBind();
        }

        private void SetData()
        {
            listaDistribucionCurrent.Nombre = this.txtNombre.Text;
            listaDistribucionCurrent.Descripcion = this.txtDescripcion.Text;
            listaDistribucionCurrent.Estado = UIHelper.GetIntFromInputCbo(this.cboEstadoListaDistribucion);
        }

        private void Save()
        {
            listaDistribucionCurrent = WebServiceHelper.SaveListaDeDistribucion(listaDistribucionCurrent);
        }

        private void Validar()
        {
            // TODO
        }

        protected void GridContactos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    Cliente cliente = (Cliente)e.Row.DataItem;

                    e.Row.Cells[0].Attributes.Add("title", "Editar");
                    e.Row.Cells[1].Attributes.Add("title", "Eliminar");
                    ImageButton btnEliminarCtrl = (ImageButton)e.Row.FindControl("btnEliminar");
                    SetJavascriptForDeleteRecord(btnEliminarCtrl, cliente.Email);                    
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridContactos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "editar")
                {
                    int contactoId = Convert.ToInt32(this.GridContactos.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);

                    SetThisPageToGoBack();

                    this.Response.Redirect(string.Format(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlCustomerEdit + "?Id={0}", contactoId), true);
                }
                else if (e.CommandName == "eliminar")
                {
                    int contactoId = Convert.ToInt32(this.GridContactos.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    WebServiceHelper.EliminarContactoDeListaDeDistribucion(listaDistribucionCurrent.Id, contactoId);
                    var cont = listaDistribucionCurrent.ContactoList.Where(i => i.Id == contactoId).Single();
                    listaDistribucionCurrent.ContactoList.Remove(cont);
                    Bind();
                }
                //else if (e.CommandName == "ver")
                //{
                //    int contactoId = Convert.ToInt32(this.GridContactos.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                //    NavigationContext.RedirectTo(MiscClass.UrlCustomerEdit, string.Format("?Id={0}", contactoId));
                //}
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void SetThisPageToGoBack()
        {
            if (this.listaDistribucionCurrent.Id != 0)
            {
                this.NavigationContext.UrlToGoBack = Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlListaDeDistribucionEdit + string.Format("?Id={0}", this.listaDistribucionCurrent.Id);
            }
        }

        private void lnkSave_Click(object sender, EventArgs e)
        {
            GuardarCommand();
        }       

        private void GuardarCommand()
        {
            try
            {
                Validar();
                SetData();
                Save();
                Bind();
                this.masterPage.ShowMessage(LocalizationProvider.Instance["Bo.Messages.MensajeSaveExitoso"], WebMessageType.Notification);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }        

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                if (!String.IsNullOrEmpty(base.NavigationContext.UrlToGoBack))
                {
                    Response.Redirect(base.NavigationContext.UrlToGoBack, true);
                }
                else
                {
                    // Por defecto...
                    SetThisPageToGoBack();
                    Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlListaDeDistribucionList, true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void agregarContactosButton_Click(object sender, EventArgs e)
        {
            try
            {
                // guardar en contexto a los contactos
                if (this.listaDistribucionCurrent.Id != 0)
                {
                    base.NavigationContext.AgregandoContactosAListaDistribucion = true;
                    base.NavigationContext.ListaDistribucionId = this.listaDistribucionCurrent.Id;
                    SetThisPageToGoBack();

                    Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlCustomerSearch + "?useContext=1", true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkExportarAExcel_Click(object sender, EventArgs e)
        {
            try
            {
                bool previousAllowPaging = this.GridContactos.AllowPaging;
                this.GridContactos.AllowPaging = false;

                BindToGrid();

                GridViewExportExcelUtil.Export("ContactosEnListaDeDistribucion.xls", this.GridContactos, 0, 1, 2);

                this.GridContactos.AllowPaging = previousAllowPaging;
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}